package com.share.dip.demo1;

/**
 * 改进：
 * 定义抽象 SwitchableDevice 接口。
 * Switch (高层) 现在只依赖于 SwitchableDevice 接口，不再依赖具体的 LightBulb 或 Fan。
 * LightBulb 和 Fan (低层实现) 都依赖于 SwitchableDevice 接口，并实现其契约。
 * 通过 依赖注入（这里是构造函数注入），在创建 Switch 时，将具体的 SwitchableDevice 实现（如 LightBulb 或 Fan）传递给它。控制权从 Switch 内部反转到了外部（谁创建 Switch，谁就决定它控制什么设备）。
 * 好处：
 * Switch 可以控制任何实现了 SwitchableDevice 的设备，无需修改自身代码（符合 OCP）。
 * 可以轻松添加新的电器（如 Heater），只要实现 SwitchableDevice 即可。
 * 测试 Switch 时，可以轻松注入一个 MockSwitchableDevice 来验证 operate() 逻辑是否正确调用了接口方法，完全不需要真实的灯泡或风扇。
 */
// 高层模块：开关 (只依赖抽象)
public class Switch {
    private SwitchableDevice device; // 依赖抽象接口

    // 依赖注入：通过构造函数传入具体实现 (控制反转)
    public Switch(SwitchableDevice device) {
        this.device = device;
    }

    public void operate() {
        if (device.isOn()) {
            device.turnOff();
        } else {
            device.turnOn();
        }
    }
}
